<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 学习自定义构造函数的作用:
        //   1.知道Array / Date / Object ... 内置对象的实现原理
        //   2.未来...(Vue/react) 会使用到自定义构造函数解决问题
        //     给未来某些知识点做铺垫,比如:原型 , 原型链,或者实例成员 / 静态成员

        // 特点:构造函数首字母大写; 构造函数使用new调用;
        function Student(name,age){
            this.name = name
            this.age = age 
            this.info = '前端81期'
            this.sleep = function(){
                console.log('学习');
            }
            this.eat = function(food){
                console.log(this.name + '吃' + food);
            }
        }

        // 创建实例1
        let s1 = new Student('张三', 18)
        console.log(s1);
        s1.sleep()
        s1.eat('热干面')
        // 创建实例2
        let s2 = new Student('李四', 28)
        console.log(s2);
        s2.sleep()
        s2.eat('黄焖鸡')


        // new 做了四件事情:

        // 1.new会帮我们开辟内存空间,装载新的实例对象;
        // 2.new会把这个构造函数中的this,指向实例对象;
        // 3.new会帮我们执行构造函数,绑定属性和方法;
        // 4.new会帮我们返回当前的实例对象;

   
        //    面向对象是让对象帮我们完成某个需求,面向过程是一步一步完成某个需求.
        //    应用场景:大型和超大型项目(困难)用面向对象,简单小就用面向过程.
        //    未来场景:我们程序员只是使用对象,不常封装对象

        // 1.简单小就用面向过程
        console.log(1);

        // 2.大型和超大型项目(困难)用面向对象.
        // console.log('联系刘德华');
        // console.log('欢送......');


        // 1 定义一个接待明星的构造函数
        // 此处this代指的就是实例对象(真实的例子)
        function Star(name, age) {
            this.name = name;
            this.age = age;


        // 2 绑定方法
            this.sing = function (song) {
                console.log('联系' + this.name);
                console.log(this.name + '唱' + song);
                console.log('欢送......');
            }
        }

        // 3 创建实例(创建真实的例子)
        const s1 = new Star('刘德华' , 58);
        s1.sing('练习')

    </script>
</body>

</html>